package modelLayer;
import java.util.ArrayList;

import ExceptionsPakke.NoSuchSalgException;

/**
 * SalgsKartotek er en container for objekter af klasssen Salg. Den er lavet i en singleton form, så vi kun
 * har en af den.
 * 
 * @author Gruppe 2
 * @version 1.0
 */
public class SalgsKartotek
{

    private ArrayList<Salg> mineSalg;
    private static SalgsKartotek instance;

    /**
     * Constructor for objekter af klassen SalgsKartotek
     */
    private SalgsKartotek()
    {
        mineSalg = new ArrayList<Salg>();
    }

    /**
     * En metode til at tjekke om en instans af SalgsKartotek eksistere, hvis ikke bliver en skabt.
     * @return SalsKartotek instance.
     */
    public static SalgsKartotek getInstance()
    {
        if(instance == null)
        {
            instance = new SalgsKartotek();
        }
        return instance;
    }

    /**
     * En metode for at tilføje objekter af klassen Salg til vores ArrayList mineSalg, har beskyttelse mod
     * tilføjelsen af 2 salg med samme ordre nummer
     * @param Salg s
     */
    public boolean addSalg(Salg s)
    {
    	boolean added = false;
        if(checkOrdreNr(s) == false)
        {
            mineSalg.add(s);
            added = true;
        }
        else
        {
            added = false;
        }
        return added;

    }

    /**
     * En metode for at tilføje varer til vores salg.
     * @param Vare v
     * @param long ordreNr
     */
    public void addVare(Vare v, long ordreNr)
    {
        Salg s = findSalg(ordreNr);
        s.addVare(v);
    }
    
    public void addVareGruppe(VareGruppe vg, long ordreNr)
    {
    	Salg s = findSalg(ordreNr);
    	s.addVareGruppe(vg);
    }

    /**
     * En metode for at tilføje udlejninger til vores salg.
     * @param Udlejning u
     * @param long ordreNr
     */
    public void addUdlejning(Udlejning u, long ordreNr)
    {
        Salg s = findSalg(ordreNr);
        s.addUdlejning(u);
    }

    /**
     * En metode for at tilføje kunder til vores salg.
     * @param Kunde k
     * @param long ordreNr
     */
    public void addKunde(Kunde k, long ordreNr)
    {
        Salg s = findSalg(ordreNr);
        s.addKunde(k);
    }

    /**
     * En metode for at slette kunder fra vores salg.
     * @param Kunde k
     * @param long ordreNr
     */
    public void sletKunde(Kunde k, long ordreNr)
    {
        Salg s = findSalg(ordreNr);
        s.sletKunde(k);
    }

    /**
     * En metode skabt til at finde specifikke salg i vores ArrayList mineSalg, bliver brugt i de fleste af vores
     * metoder. 
     * @param String cprNr
     * @return Salg s
     */
    public Salg findSalg(long ordreNr)
    {
        int index = 0;
        boolean searching = true;
        while(searching == true && mineSalg.size()>index)
        {
            Salg s = mineSalg.get(index);
            if(s.getOrdreNr()== ordreNr)
            {
                searching = false;
            }
            else
            {
                index++;
            }
        }
        if(!searching)
        {
            return mineSalg.get(index);
        }
        else
        {
            return null;
        }
    }

    /**
     * En metode skabt til at slette salg fra vores ArrayList mineSalg.
     * @param long ordreNr
     * @return boolean sletSalg
     */
    public void sletSalg(long ordreNr) throws NoSuchSalgException
    {
    	
         Salg s = findSalg(ordreNr);
         if(s != null)
         {
        	 mineSalg.remove(s);
         }
         else
         {
        	 throw new NoSuchSalgException("Salget findes ikke");
         }
           
    }

    /**
     * En metode som tager alle informationerne omkring specifikke salg, og gemmer dem i en ArrayList.
     * @return ArrayList<String> kartotek.
     */
    public ArrayList<String> printSalgsKartotek()
    {
        ArrayList<String> kartotek = new ArrayList<String>();
        for(Salg s : mineSalg)
        {
            kartotek.addAll(s.printSalg());
            kartotek.add("\n");
        }
        return kartotek;
    }

    /**
     * En metode som opdatere ordreNr
     * @param long ordreNr
     * @param long nyOrdreNr
     */
    public void updateOrdreNr(long ordreNr, long nyOrdreNr)
    {
        Salg s = findSalg(ordreNr);
        s.setOrdreNr(nyOrdreNr);
    }

    /**
     * En metode som opdatere total
     * @param long ordreNr
     */
    public void updateTotal(long ordreNr)
    {
        Salg s = findSalg(ordreNr);
        s.setTotal();
    }

    /**
     * En metode som opdatere rabat
     * @param long ordreNr
     * @param int rabat
     */
    public void updateRabat(long ordreNr, int rabat)
    {
        Salg s = findSalg(ordreNr);
        s.setRabat(rabat);
    }
    
    public void opdaterSalg(long ordre, long nyOrdre, int rabat) throws NoSuchSalgException
    {
    	Salg s = findSalg(ordre);
    		if(s != null)
    		{
    			s.setOrdreNr(nyOrdre);
    			s.setRabat(rabat);
    		}
    		else
    		{
    			throw new NoSuchSalgException("Salget findes ikke");
    		}
    	
    }

    /**
     * En metode some tjekker om en salg med samme ordre nummer allerede findes i vores ArrayList
     * hvis den finder en udksriver den en besked om at man ikke kan tilføje 2 med samme.
     * @param Salg s
     * @return boolean found
     */
    public boolean checkOrdreNr(Salg s)
    {
        boolean found = false;
        int index = 0;
        while(index < mineSalg.size())
        {
            Salg sNr = mineSalg.get(index);
            if(s.getOrdreNr() != sNr.getOrdreNr())
            {
                found = false;
                index++;
            }
            else
            {
                found = true;
                index++;
            }
        }
        return found;
    }
}
